/**
 * 
 */
package br.com.skynix.tcmc.model.financeiro;

import java.math.BigDecimal;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;

import br.com.skynix.tcmc.base.model.EntidadeDominio;
import br.com.skynix.tcmc.model.conta.Conta;
import br.com.skynix.tcmc.model.enumeration.ProvisaoEnum;
import br.com.skynix.tcmc.model.enumeration.StatusFinanceiroEnum;
import br.com.skynix.tcmc.model.enumeration.TipoContaFinanceiroEnum;
import br.com.skynix.tcmc.model.rh.Empresa;
import br.com.skynix.tcmc.model.rh.Funcionario;

/**
 * @author davi
 * 
 */
@Entity
@Table(name = "tb_conta_financeiro")
public class ContaFinanceiro extends EntidadeDominio {
	@NotNull
	@ManyToOne
	@JoinColumn(name = "id_empresa_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK001_conta_financeiro")
	private Empresa empresa;

	@ManyToOne
	@JoinColumn(name = "id_centro_custo_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK002_conta_financeiro")
	private CentroCusto centroCusto;

	@ManyToOne
	@JoinColumn(name = "id_despesa_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK003_conta_financeiro")
	private Despesa despesa;

	@ManyToOne
	@JoinColumn(name = "id_portador_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK004_conta_financeiro")
	private Portador portador;

	@ManyToOne
	@JoinColumn(name = "id_banco_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK005_conta_financeiro")
	private Banco banco;

	@ManyToOne
	@JoinColumn(name = "id_funcionario_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK006_conta_financeiro")
	private Funcionario funcionario;

	@ManyToOne
	@JoinColumn(name = "id_conta_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK007_conta_financeiro")
	private Conta conta;

	@ManyToOne
	@JoinColumn(name = "id_forma_pagamento_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK008_conta_financeiro")
	private FormaPagamento formaPagamento;

	@Size(max = 50)
	@Column(name = "numero_documento", nullable = true, length = 50)
	private String numeroDocumento;

	@Size(max = 50)
	@Column(name = "nosso_numero", nullable = true, length = 50)
	private String nossoNumero;

	@NotNull
	@Column(name = "data_emissao", nullable = false)
	private Timestamp dataEmissao;

	@NotNull
	@Column(name = "data_vencimento", nullable = false)
	private Timestamp dataVencimento;

	@Column(name = "numero_parcela", nullable = true)
	private Integer numeroParcela;

	@NotNull
	@Column(nullable = false, precision = 15, scale = 2)
	private BigDecimal valor;

	@Column(nullable = true, precision = 15, scale = 2)
	private BigDecimal desconto;

	@Column(name = "valor_pago", nullable = true, precision = 15, scale = 2)
	private BigDecimal valorPago;

	@Column(name = "data_pagamento", nullable = true)
	private Timestamp dataPagamento;

	@Column(nullable = true, columnDefinition = "TEXT DEFAULT NULL")
	private String observacao;

	@NotNull
	@Size(max = 1)
	@Column(name = "flag_tipo", nullable = false, length = 1,
			columnDefinition = "CHAR(1) DEFAULT 'P'")
	@Enumerated(EnumType.STRING)
	private TipoContaFinanceiroEnum flagTipo;

	@NotNull
	@Size(max = 1)
	@Column(name = "flag_status", nullable = false, length = 1,
			columnDefinition = "CHAR(1) DEFAULT 'A'")
	@Enumerated(EnumType.STRING)
	private StatusFinanceiroEnum flagStatus;

	@Size(max = 1)
	@Column(name = "flag_provisao", length = 1,
			columnDefinition = "CHAR(1) DEFAULT NULL")
	@Enumerated(EnumType.STRING)
	private ProvisaoEnum flagProvisao;

	@Column(name = "quantidade_parcelas", nullable = true)
	private Integer quantidadeParcelas;

	/**
	 * @return the empresa
	 */
	public Empresa getEmpresa() {
		return empresa;
	}

	/**
	 * @param empresa the empresa to set
	 */
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	/**
	 * @return the centroCusto
	 */
	public CentroCusto getCentroCusto() {
		return centroCusto;
	}

	/**
	 * @param centroCusto the centroCusto to set
	 */
	public void setCentroCusto(CentroCusto centroCusto) {
		this.centroCusto = centroCusto;
	}

	/**
	 * @return the despesa
	 */
	public Despesa getDespesa() {
		return despesa;
	}

	/**
	 * @param despesa the despesa to set
	 */
	public void setDespesa(Despesa despesa) {
		this.despesa = despesa;
	}

	/**
	 * @return the portador
	 */
	public Portador getPortador() {
		return portador;
	}

	/**
	 * @param portador the portador to set
	 */
	public void setPortador(Portador portador) {
		this.portador = portador;
	}

	/**
	 * @return the banco
	 */
	public Banco getBanco() {
		return banco;
	}

	/**
	 * @param banco the banco to set
	 */
	public void setBanco(Banco banco) {
		this.banco = banco;
	}

	/**
	 * @return the funcionario
	 */
	public Funcionario getFuncionario() {
		return funcionario;
	}

	/**
	 * @param funcionario the funcionario to set
	 */
	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	/**
	 * @return the conta
	 */
	public Conta getConta() {
		return conta;
	}

	/**
	 * @param conta the conta to set
	 */
	public void setConta(Conta conta) {
		this.conta = conta;
	}

	/**
	 * @return the formaPagamento
	 */
	public FormaPagamento getFormaPagamento() {
		return formaPagamento;
	}

	/**
	 * @param formaPagamento the formaPagamento to set
	 */
	public void setFormaPagamento(FormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	/**
	 * @return the numeroDocumento
	 */
	public String getNumeroDocumento() {
		return numeroDocumento;
	}

	/**
	 * @param numeroDocumento the numeroDocumento to set
	 */
	public void setNumeroDocumento(String numeroDocumento) {
		this.numeroDocumento = numeroDocumento;
	}

	/**
	 * @return the nossoNumero
	 */
	public String getNossoNumero() {
		return nossoNumero;
	}

	/**
	 * @param nossoNumero the nossoNumero to set
	 */
	public void setNossoNumero(String nossoNumero) {
		this.nossoNumero = nossoNumero;
	}

	/**
	 * @return the dataEmissao
	 */
	public Timestamp getDataEmissao() {
		return dataEmissao;
	}

	/**
	 * @param dataEmissao the dataEmissao to set
	 */
	public void setDataEmissao(Timestamp dataEmissao) {
		this.dataEmissao = dataEmissao;
	}

	/**
	 * @return the dataVencimento
	 */
	public Timestamp getDataVencimento() {
		return dataVencimento;
	}

	/**
	 * @param dataVencimento the dataVencimento to set
	 */
	public void setDataVencimento(Timestamp dataVencimento) {
		this.dataVencimento = dataVencimento;
	}

	/**
	 * @return the numeroParcela
	 */
	public Integer getNumeroParcela() {
		return numeroParcela;
	}

	/**
	 * @param numeroParcela the numeroParcela to set
	 */
	public void setNumeroParcela(Integer numeroParcela) {
		this.numeroParcela = numeroParcela;
	}

	/**
	 * @return the valor
	 */
	public BigDecimal getValor() {
		return valor;
	}

	/**
	 * @param valor the valor to set
	 */
	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	/**
	 * @return the desconto
	 */
	public BigDecimal getDesconto() {
		return desconto;
	}

	/**
	 * @param desconto the desconto to set
	 */
	public void setDesconto(BigDecimal desconto) {
		this.desconto = desconto;
	}

	/**
	 * @return the valorPago
	 */
	public BigDecimal getValorPago() {
		return valorPago;
	}

	/**
	 * @param valorPago the valorPago to set
	 */
	public void setValorPago(BigDecimal valorPago) {
		this.valorPago = valorPago;
	}

	/**
	 * @return the dataPagamento
	 */
	public Timestamp getDataPagamento() {
		return dataPagamento;
	}

	/**
	 * @param dataPagamento the dataPagamento to set
	 */
	public void setDataPagamento(Timestamp dataPagamento) {
		this.dataPagamento = dataPagamento;
	}

	/**
	 * @return the observacao
	 */
	public String getObservacao() {
		return observacao;
	}

	/**
	 * @param observacao the observacao to set
	 */
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	/**
	 * @return the flagTipo
	 */
	public TipoContaFinanceiroEnum getFlagTipo() {
		return flagTipo;
	}

	/**
	 * @param flagTipo the flagTipo to set
	 */
	public void setFlagTipo(TipoContaFinanceiroEnum flagTipo) {
		this.flagTipo = flagTipo;
	}

	/**
	 * @return the flagStatus
	 */
	public StatusFinanceiroEnum getFlagStatus() {
		return flagStatus;
	}

	/**
	 * @param flagStatus the flagStatus to set
	 */
	public void setFlagStatus(StatusFinanceiroEnum flagStatus) {
		this.flagStatus = flagStatus;
	}

	/**
	 * @return the flagProvisao
	 */
	public ProvisaoEnum getFlagProvisao() {
		return flagProvisao;
	}

	/**
	 * @param flagProvisao the flagProvisao to set
	 */
	public void setFlagProvisao(ProvisaoEnum flagProvisao) {
		this.flagProvisao = flagProvisao;
	}

	/**
	 * @return the quantidadeParcelas
	 */
	public Integer getQuantidadeParcelas() {
		return quantidadeParcelas;
	}

	/**
	 * @param quantidadeParcelas the quantidadeParcelas to set
	 */
	public void setQuantidadeParcelas(Integer quantidadeParcelas) {
		this.quantidadeParcelas = quantidadeParcelas;
	}
}
